package com.easyticket.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import org.junit.Test;

/**
 * 时间处理的工具类
 * @author lmy
 */
public class DateTimeUtil {
	public static final String DEFAULT_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss";
	
	public static final String Format_Date = "yyyy-MM-dd";
	
	public static final String Format_Time = "HH:mm:ss";
	
	public final static int YEAR = 10;
    
	public final static int MONTH = 20;
    
    public final static int DAY = 30;
    
    public final static int HOUR = 40;
    
    public final static int MINUTE = 50;
    
    public final static int SECOND = 60;
    
    public final static String YYYY_MM_DD_HHMMSS = "yyyy-MM-dd HH:mm:ss";
    
    public final static String YYYY_MM_DD_HHMMSS_DIFFER = "yyyy/MM/dd HH:mm:ss";
    
    public final static String YYYYMMDD_HHMMSS = "yyyyMMdd HH:mm:ss";
    
    public final static String YYYYMMDD_HHMMSS_CHINESE = "yyyy年MM月dd日HH时mm分ss秒";
    
    public final static String YYYY_MM_DD = "yyyy-MM-dd";
    
    public final static String YYYY_MM_DD_DIFFER = "yyyy/MM/dd";
    
    public final static String YYYYMMDD = "yyyyMMdd";
    
    public final static String YYYYMMDD_CHINESE = "yyyy年MM月dd日";
    
    public final static String HHMMSS = "HH:mm:ss";
    
    public final static String HH_MM_SS_CHINESE = "HH时mm分ss秒";
	
	public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Format_Date);
	
	public static SimpleDateFormat simpleTimeFormat = new SimpleDateFormat(Format_Time);
	
	/**
	 * 返回当前的日期，格式为YYYY-MM-DD
	 * @return String
	 */
	public static String getCurrentDate() {
		return simpleDateFormat.format(new Date());
	}
	
	/**
	 * 按指定的格式，生成当前日期
	 * @param format String
	 * @return String
	 */
	public static String getCurrentDate(String format) {
		SimpleDateFormat t = new SimpleDateFormat(format);
		return t.format(new Date());
	}
	
	public static String getCurrentTime() {
		return simpleTimeFormat.format(new Date());
	}
	
	public static String getCurrentTime(String format) {
		SimpleDateFormat t = new SimpleDateFormat(format);
		return t.format(new Date());
	}
	
	/**
	 * 将Date类型数据字符串化
	 * @param date Date
	 * @return String
	 */
	public static String toString(Date date){
		return simpleDateFormat.format(date);
	}
	
	/**
	 * 按固定格式将日期字符串化
	 * @param date Date
	 * @param format String
	 * @return String
	 */
	public static String toString(Date date,String format){
		SimpleDateFormat t = new SimpleDateFormat(format);
		return t.format(date);
	}
	
	/**
	 * 按默认的格式，将字符串类型的数据日期化
	 * @param str String
	 * @return Date
	 */
	public static Date parse(String str){
		try {
			return simpleDateFormat.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 按指定的格式将字符串日期化
	 * @param str String
	 * @param format String
	 * @return Date
	 */
	public static Date parse(String str, String format){
		try {
			SimpleDateFormat t = new SimpleDateFormat(format);
			return t.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 返回两个日期差的天数
	 * @param sdate Date
	 * @param edate Date
	 * @return String
	 */
	public static String daysInterval(Date sdate, Date edate){
		return   "" + (sdate.getTime() - sdate.getTime()) / (3600*24*1000);
	}
	
	/**dfdfdfd
     * 功能：格式化当前日期
     * 
     * @param DATE_FORMAT_CODE
     *            //日期格式
     * @return String //返回格式化后的日期
     */
    public static String getFmtDateTime(String formatCode) {
            Date date = new Date();
            return getFmtDateTime(date.getTime(), formatCode);
    }

    /**
     * 功能：格式化指定日期
     * 
     * @param millis
     *            //日期的毫秒级
     * @param DATE_FORMAT_CODE
     *            //日期格式
     * @return String //返回格式化后的日期
     */
    public static String getFmtDateTime(long millis, String formatCode) {
            SimpleDateFormat sdf;
            sdf = new SimpleDateFormat(formatCode, Locale.SIMPLIFIED_CHINESE);
            // sdf.applyPattern(DATE_FORMAT_CODE);
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(millis);
            return sdf.format(cal.getTime().getTime());
    }

    /**
     * 功能:获得指定日期的年、月、日、时、分、秒的整数数组
     * 
     * @param String
     *            date //格式YYYY-MM-DD HH:mm:SS
     * @return int[] //返回分隔出来的整型部分.
     */
    public static int[] getPartForDate(String date) {
            int[] t = new int[6];
            String tmp = date.substring(0, 4); // YYYY
            t[0] = Integer.parseInt(tmp);

            tmp = date.substring(5, 7); // MM
            t[1] = Integer.parseInt(tmp);

            tmp = date.substring(8, 10); // DD
            t[2] = Integer.parseInt(tmp);

            tmp = date.substring(11, 13); // HH
            t[3] = Integer.parseInt(tmp);

            tmp = date.substring(14, 16); // mm
            t[4] = Integer.parseInt(tmp);

            tmp = date.substring(17); // SS
            t[5] = Integer.parseInt(tmp);

            return t;
    }

    /**
     * 功能：得到当前日期的毫秒级
     * 
     * @return long //返回long.
     */
    public static long getMillis() {
            Date date = new Date();
            return date.getTime();
    }

    /**
     * 功能：YYYY-MM-DD HH:mm:SS转换成相应的毫秒级
     * 
     * @param String
     *            strDate //时间格式：YYYY-MM-DD HH:mm:SS
     * @return long //返回long.
     */
    public static long getMillis(String strDate) {
            Calendar cal = Calendar.getInstance();
            int[] t = getPartForDate(strDate);
            cal.set(t[0], t[1] - 1, t[2], t[3], t[4], t[5]);
            Date date = cal.getTime();
            return date.getTime();
    }

    /**
     * 功能：指定日期的基础上增减日期（年、月、日、时、分、秒）
     * @param millis //指定日期
     * @param amount //增量（正数或负数）
     * @param field        //年、月、日、时、分、秒
     * @return long //返回毫秒级
     */
    public static long getMillis(long millis, int amount, int field) {
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(millis);
            switch (field) {
            case 10:// 加年
                    cal.add(Calendar.YEAR, amount);
                    break;
            case 20:// 加月
                    cal.add(Calendar.MONTH, amount);
                    break;
            case 30:// 加日
                    cal.add(Calendar.DATE, amount);
                    break;
            case 40:// 加时
                    cal.add(Calendar.HOUR, amount);
                    break;
            case 50:// 加分
                    cal.add(Calendar.MINUTE, amount);
                    break;
            case 60:// 加秒
                    cal.add(Calendar.SECOND, amount);
            default:// 默认加天
                    cal.add(Calendar.DATE, amount);
            }
            return cal.getTime().getTime();
    }
    
    @Test
    public void testDateUtil() {
            System.out.println("当前时间："
                 + DateTimeUtil.getFmtDateTime(DateTimeUtil.YYYY_MM_DD_HHMMSS));
            System.out.println("当前时间："
                 + DateTimeUtil.getFmtDateTime(DateTimeUtil.HHMMSS));
            System.out.println("当前时间毫秒级：" + DateTimeUtil.getMillis());
            System.out.println("指定时间2006-10-17 00:00:00的毫秒级："
                 + DateTimeUtil.getMillis("2009-08-17 00:00:00"));
            System.out.println("指定时间2006-10-17 00:00:00格式化成yyyy年MM月dd日hh时mm分ss秒:"
                 + DateTimeUtil.getFmtDateTime(DateTimeUtil.getMillis("2009-08-17 00:00:00"),
                     DateTimeUtil.YYYY_MM_DD_DIFFER));
            System.out.println(DateTimeUtil.getFmtDateTime(DateTimeUtil.getMillis(
                1161014400406L, 5, 20), DateTimeUtil.YYYY_MM_DD_HHMMSS));
            // System.out.println(DateUtil.getFmtDateTime(DateUtil.DATE_FORMAT_CODE_1));
            // System.out.println(DateUtil.getFmtDateTime(DateUtil.TIME_FORMAT_CODE_1));
    }
}
